<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /**
         * 和II的区别：你最多可以完成 两笔 交易。表示最多买两次，可以只买一次，也可以1次也不买

         * 输入：[3,3,5,0,0,3,1,4]
         * 输出：6
         * 解释： 在第 4 天（股票价格 = 0）的时候买入，在第 6 天（股票价格 = 3）的时候卖出，这笔交易所能获得利润 = 3-0 = 3 。
                 随后，在第 7 天（股票价格 = 1）的时候买入，在第 8 天 （股票价格 = 4）的时候卖出，这笔交易所能获得利润 = 4-1 = 3 。
         * 
         * 输入: prices = [1,2,3,4,5]
         * 输出: 4
         * 解释: 第一天买入，第五天卖出，
         * 
        */
        /* 
            时间：O(n)
            空间：O(1)
            思路：
                每一天都有五种状态：
                    不做任何处理
                    第一次买入
                    第一次卖出
                    第二次买入
                    第二次卖出
            dp[i][0] = 0
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i])，第i天，第一次买入股票的状态，但可能是第i-1天已经买了，然后现在是持有状态
            dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i])，第i-1天，第一次卖出股票的状态，但可能是第i-1天已经卖出了，现在是空的状态
            dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i])
            dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i])
        */
        var maxProfit = function(prices) {
            // 初始化
            // let dp = new Array(prices.length)
            // for (let i = 0; i < dp.length; i++) {
            //     dp[i] = [0, 0, 0, 0, 0]
            // }
            let dp = new Array(prices.length).fill(0).map(() => new Array(5).fill(0))
            dp[0][1] = -prices[0]
            dp[0][3] = -prices[0]
            let totalProfit = 0; // 初始化总利润为0
            for (let i = 1; i < prices.length; i++) { // 遍历每一天作为买入时机
                dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i])
                dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i])
                dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i])
                dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i])
            }
            return dp[prices.length - 1][4]; // 返回总利润
        };
        console.log(maxProfit([3,3,5,0,0,3,1,4]));
        console.log(maxProfit([1,2,3,4,5]));
    </script>
</body>

</html>